/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package baseDatos;

import entidades.Enfermedad;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Facundo
 */
public class EnfermedadDAO {

    private String query;
    private Connection conDB;
    private PreparedStatement pst;

    public EnfermedadDAO(Connection con) {
        this.conDB = con;
    }

    public EnfermedadDAO() {
    }

    /**
     * @return the query
     */
    public String getQuery() {
        return query;
    }

    /**
     * @param query the query to set
     */
    public void setQuery(String query) {
        this.query = query;
    }

    /**
     * @return the conDB
     */
    public Connection getConDB() {
        return conDB;
    }

    /**
     * @param conDB the conDB to set
     */
    public void setConDB(Connection conDB) {
        this.conDB = conDB;
    }

    /**
     * @return the pst
     */
    public PreparedStatement getPst() {
        return pst;
    }

    /**
     * @param pst the pst to set
     */
    public void setPst(PreparedStatement pst) {
        this.pst = pst;
    }

    /*
     * metodo que devuelve un objeto Enfermedad de acuerdo al codigo pasado por parametro
     */
    public Enfermedad getEnfermedad(int codigo) {
        Enfermedad enfe = null;
        setQuery("select * from PC_ENFERMEDAD where codigo_enfermedad = " + codigo);
        enfe = this.devolverEnfermedad(getQuery());
        return enfe;
    }

    /*
     * Metodo que devuelve un objeto enfermedad de acuerdo al nombre pasado por parametro
     */
    public Enfermedad getEnfermedad(String nombre) {
        Enfermedad enfe = null;
        setQuery("select * from PC_ENFERMEDAD where nombre= '" + nombre + "'");
        enfe = this.devolverEnfermedad(getQuery());
        return enfe;
    }


    /*
     * Metodo que devuelve un objeto enfermedad de acuerdo a la sentencia que viene por parametro
     */
    private Enfermedad devolverEnfermedad(String sentencia) {
        Enfermedad enfe = null;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                enfe = new Enfermedad();
                enfe.setNombre(rs.getString("nombre"));
                if (rs.getString("descripcion") != null) {
                    enfe.setDescripcion(rs.getString("descripcion"));
                }
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(EnfermedadDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return enfe;
    }

    /*
     * Metodo que devuelve un arrayList de enfermedades
     *
     */
    public ArrayList getEnfermedades() {
        ArrayList todos = null;
        setQuery("select * from PC_ENFERMEDAD");
        todos = this.devolverEnfermedades(getQuery());
        return todos;
    }

    /*
     * Metodo que retorna un arrayList de enfermedades, de acuerdo a la sentencia
     * recibida como parametro de entrada
     */
    private ArrayList devolverEnfermedades(String sentencia) {
        ArrayList todos = null;
        Enfermedad enfe = null;
        ResultSet rs;
        setQuery(sentencia);
        try {
            todos = new ArrayList();
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                enfe = new Enfermedad();
                enfe.setNombre(rs.getString("nombre"));
                if (rs.getString("descripcion") != null) {
                    enfe.setDescripcion(rs.getString("descripcion"));
                }
                todos.add(enfe);
            }
            rs.close();
            getPst().close();
        } catch (SQLException ex) {
            Logger.getLogger(EnfermedadDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return todos;
    }

    /*
     * Metodo que devuelve un codigo de una enfermedad (int) de acuerdo al nombre que recibe por parametro
     */
    public int devolverCodigoEnfermedad(String nombre) {

        int codigo = -1;
        ResultSet rs = null;
        setQuery("select codigo_enfermedad from PC_ENFERMEDAD where nombre='" + nombre + "'");
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                codigo = rs.getInt("codigo_enfermedad");
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(EnfermedadDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return codigo;
    }

    public Enfermedad getEnfermedadAnimal(String nombre) {
        try {
            Enfermedad res = null;
            int cod_enfermedad=-1;
            String sql = "SELECT codigo_enfermedad FROM pc_detalle_enfermedad det, pc_historial hist "
                    + "WHERE det.codigo_historial = hist.numero AND hist.codigo_animal = "
                    + "(SELECT codigo_animal FROM pc_animal WHERE nombre = '" + nombre + "')";
            this.setPst(this.getConDB().prepareStatement(sql));
            ResultSet rs = this.getPst().executeQuery();
            while (rs.next()) {
                cod_enfermedad=rs.getInt("codigo_enfermedad");
                res=this.getEnfermedad(cod_enfermedad);
            }
            rs.close();
            this.getPst().close();
            return res;
        } catch (SQLException ex) {
            Logger.getLogger(EnfermedadDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}
